package utils

import (
	"fmt"
	. "reflect"
)

func MustBool(value interface{}) bool {
	if res, err := ToBool(value); err == nil {
		return res
	} else {
		panic(err)
	}
}

// 字符串中将"1", "t", "T", "true", "TRUE", "True"转为true
// 将"0", "f", "F", "false", "FALSE", "False", ""转为false，空字符串也转为false
// 数字中仅支持将0转为false，1转为true。
func ToBool(value interface{}) (res bool, err error) {
	res = false
	err = nil
	switch value.(type) {
	case string:
		{
			str := MustString(value)
			switch str {
			case "1", "t", "T", "true", "TRUE", "True", "YES", "Yes":
				{
					res = true
				}
			case "0", "f", "F", "false", "FALSE", "False", "NO", "No", "":
				{
					res = false
				}
			default:
				err = fmt.Errorf("utils: %v to boolean failed.", value)
			}
		}
	case bool:
		{
			res = value.(bool)
		}
	default:
		valueStr := MustString(value)
		res, err = ToBool(valueStr)
	}
	return
}

// 尽最大努力将目标转换为[]int
func ToBoolArray(value interface{}) (resArray []bool, err error) {
	t := TypeOf(value)
	switch t.Kind() {
	case Array, Slice:
		{
			v := ValueOf(value)
			resArray = make([]bool, v.Len())
			for index, _ := range resArray {
				resArray[index], err = ToBool(v.Index(index).Interface())
				if err != nil {
					return nil, fmt.Errorf("utils: can not utils %v at index %d", v.Index(index).Interface(), index)
				}
			}
			return resArray, nil
		}
	}
	return nil, fmt.Errorf("utils: %T is not an array or slice.", value)
}

// 尽最大努力将目标转换为[]bool，失败会panic
func MustBoolArray(value interface{}) (resArray []bool) {
	if res, err := ToBoolArray(value); err == nil {
		return res
	} else {
		panic(err)
	}
}
